home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / eulisp / mpfeel.lha / MPFeel / Plurals / main.c < prev    next >
C/C++ Source or Header  |  1992-04-23  |  8KB  |  342 lines

  1. #include <stdio.h>
  2. #include <strings.h>
  3.  
  4. #include "debug.h"
  5. #include "constant.h"
  6. #include "mp_eubang.h"
  7. #include "mp_arith.h"
  8.  
  9. #define CONTEXT 1
  10.  
  11. typedef char *mp_word;
  12.  
  13. #define DBG(x) 
  14. #define DEBUG(x) 
  15.  
  16. struct Variable_ {
  17.   char    name[20];
  18.   char   *context;
  19.   mp_word value;
  20.   struct  Variable_ *next;
  21. };
  22.  
  23. typedef struct Variable_ Variable;
  24.  
  25. Variable *root = NULL;
  26.  
  27. Variable *add_variable();
  28. Variable *find_variable();
  29.  
  30. char  fe_scratch[1024][64];
  31. char *pe_scratch;
  32.  
  33. int main()
  34.  
  35. {
  36.   char *null=0;
  37.   char command[80];
  38.   char name[80];
  39.   char number[20];
  40.   int length;
  41.   Variable *context;
  42.   Variable *current;
  43.   Variable *arg1;
  44.   Variable *arg2;
  45.   int data[1024];
  46.   char des[64];
  47.   int index,value;
  48.   int tmp_result;
  49.   int command_id;
  50.   int transferred;
  51.   static int std_cons_des[20] = {20, 2, 1, 1, 2, 1, 2, 2, 1, 3, 2, 1, 4, 2, 1, 5, 2, 1, 6, 0};
  52.   int des_length;
  53.   float f_value;
  54.   int i;
  55.  
  56. DBG_CALL("main");
  57. DBG_ARGS(fprintf(dbg,"void"));
  58.  
  59. DEBUG(fprintf(dbg,"first four bytes of zero = %08lx\n",zero));
  60.  
  61.   if ((pe_scratch=(char *)callRequest(mp_init_plural,0)) == FAIL) exit(1);
  62.  
  63.   while ((scanf("%s",command) != EOF) && (strcmp(command,"quit") != 0))
  64.     {
  65.       if (strcmp(command, "new") == 0) {
  66.  
  67.     scanf("%s",name);
  68.     current = add_variable( name );
  69.     scanf("%d",&length);
  70.     current->context = callRequest(mp_make_context,4,length);
  71.     current->value   = callRequest(mp_make_plural,4,current->context);
  72.       }
  73.       else if (strcmp(command, "make") == 0) {
  74.  
  75.     scanf("%s",name);
  76.     current = add_variable( name );
  77.     scanf("%s",name);
  78.     context = add_variable( name );
  79.     current->context = context->context;
  80.     current->value = callRequest(mp_make_plural,4,current->context);
  81.  
  82.       }
  83.       else if (strcmp(command, "debug") == 0) {
  84.  
  85.     *null=9;
  86.       }
  87.       else if((strcmp(command,"set")==0) || ((strcmp(command,"bang")==0))) {
  88.     
  89.     scanf("%s",name);
  90.     current = add_variable( name );
  91.     scanf("%s",number);
  92.  
  93.      if (strstr(number, "#") != 0) {
  94.  
  95.       sscanf(&number[1],"%d",&value);
  96.       des_length = sizeof(int);
  97.       des[(des_length)++] = MP_VECTOR;
  98.       des[(des_length)++] = value;
  99.       for (i = 0; i< value; i++) des[(des_length)++] = 0;
  100.       memcpy(des, (char *) &des_length, sizeof(int));
  101.     }
  102.     else if (strstr(number,".") == 0) {
  103.  
  104.       sscanf(number,"%d",&value);
  105.       des_length = sizeof(int);
  106.       des[(des_length)++] = INTEGER;
  107.       memcpy(des+des_length, (char *) &value, sizeof(int));
  108.       des_length = des_length + sizeof(int);
  109.       memcpy(des, (char *) &des_length, sizeof(int));
  110.     }
  111.     else {
  112.  
  113.       sscanf(number, "%f", &f_value);
  114.       des_length = sizeof(int);
  115.       des[(des_length)++] = MP_FLOAT;
  116.       memcpy(des+des_length, (char *) &f_value, sizeof(int));
  117.       des_length = des_length + sizeof(float);
  118.       memcpy(des, (char *) &des_length, sizeof(int));
  119.     }      
  120.     if (strcmp(command, "bang") == 0) {
  121.  
  122.       callRequest(mp_plural,24,current->context,MP_BANG,2,1,
  123.                            current->value,des);
  124.     }
  125.     else {
  126.  
  127.       scanf("%d",&index);
  128.       callRequest(mp_plural,28,current->context,MP_SET,3,1,
  129.                            current->value,index,des);
  130.     }
  131.       }
  132.       else if (strcmp(command,"vecs") == 0) {
  133.  
  134.     scanf("%s",name);
  135.     current = add_variable( name );
  136.     scanf("%s",name);
  137.     arg1 = add_variable( name );
  138.     current->context = arg1->context;
  139.     current->value = callRequest(mp_plural,20,arg1->context,MP_MAKE_VECTOR,
  140.                      1,1,arg1->value);
  141.  
  142.       }
  143.       else if (strcmp(command, "if") == 0) {
  144.  
  145.         scanf("%s",name);
  146.     current = add_variable( name );
  147.     callRequest(mp_plural,20,current->context,MP_IF,1,1,current->value);
  148.       }
  149.       else if (strcmp(command, "else") == 0) {
  150.  
  151.         scanf("%s",name);
  152.     current = add_variable( name );
  153.     callRequest(mp_plural,20,current->context,MP_ELSE,1,1,current->value);
  154.       }
  155.       else if (strcmp(command, "ctxt") == 0) {
  156.  
  157.     scanf("%s",name);
  158.     current = add_variable( name );
  159.     callRequest(mp_plural,20,current->context,MP_CONTEXT,1,1,
  160.                          current->value);
  161.     transferred = blockIn(pe_scratch,fe_scratch,0,0,32,32,64);
  162.     fprintf(stdout,"#P( ");
  163.     for(i=0;i<1024;i++) {
  164.       if (fe_scratch[i][0] != NULL) 
  165.         fprintf(stdout,"%s ",&fe_scratch[i][0]);
  166.     }
  167.     fprintf(stdout,")\n");
  168.       }
  169.  
  170.       else if (strcmp(command, "assign") == 0) {
  171.  
  172.     scanf("%s",name);
  173.     current = add_variable( name );
  174.     scanf("%s",name);
  175.     arg1 = add_variable( name );
  176.     callRequest(mp_plural,24,current->context,MP_ASSIGN,2,2,
  177.                                  current->value,arg1->value);
  178.       }
  179.     
  180.       else if (strcmp(command, "fi") == 0) {
  181.  
  182.     scanf("%s",name);
  183.     current = add_variable( name );
  184.     callRequest(mp_plural,20,current->context,MP_FI,1,1,current->value);
  185.       }
  186.       else if (strcmp(command, "=") == 0) {
  187.  
  188.     scanf("%s",name);
  189.     current = add_variable( name );
  190.     scanf("%s",command);
  191.     command_id = command[0];
  192.     scanf("%s",name);
  193.     arg1 = add_variable( name );
  194.     scanf("%s",name);
  195.     arg2 = add_variable( name );
  196.     current->context = arg1->context;
  197.     switch (command_id) {
  198.  
  199.     case '+' :
  200.       current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
  201.                        arg1->value,arg2->value,MP_PLUS);
  202.       break;
  203.  
  204.     case '-' :
  205.       current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
  206.                        arg1->value,arg2->value,MP_DIFFERENCE);
  207.       break;
  208.  
  209.     case '/' :
  210.       current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
  211.                        arg1->value,arg2->value,MP_DIVIDE);
  212.       break;
  213.  
  214.     case '*' :
  215.       current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
  216.                        arg1->value,arg2->value,MP_TIMES);
  217.       break;
  218.  
  219.     case '%' :
  220.       current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
  221.                        arg1->value,arg2->value,MP_REMAINDER);
  222.       break;
  223.       
  224.     case '=' :
  225.       current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
  226.                        arg1->value,arg2->value,MP_EQ);
  227.       break;
  228.       
  229.     case '<' :
  230.       current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
  231.                        arg1->value,arg2->value,MP_LT);
  232.       break;
  233.       
  234.     case '>' :
  235.       current->value=callRequest(mp_plural,28,arg1->context,MP_BIN_OP,3,2,
  236.                        arg1->value,arg2->value,MP_GT);
  237.       break;
  238.       
  239.     case '2' :
  240.       current->value=callRequest(mp_plural,24,arg1->context,MP_MP_CONS,2,2,
  241.                        arg1->value, arg2->value);
  242.       break;
  243.       
  244.     case 'v' :
  245.       current->value = callRequest(mp_plural,28,arg1->context,
  246.                        MP_VECTOR_SET,3,3,current->value, 
  247.                        arg1->value,arg2->value);
  248.       break;
  249.  
  250. /*    case 'i' :
  251.       tmp_result = callRequest(cm_identify,16,
  252.                        arg1->context, arg1->value,
  253.                        arg2->context, arg2->value);
  254.  
  255.       current->value =   *((unsigned short int *) &tmp_result);
  256.       current->context = *(((unsigned short int *) &tmp_result) +1);
  257.       
  258.     case 'm' :
  259.       current->value = callRequest(mp_match,8,arg1->value,arg2->value);
  260.       break;
  261.  
  262.     case 's' :
  263.       current->value = callRequest(mp_move,8,arg1->value,arg2->value);
  264.       break;
  265. */
  266.     }
  267.       }
  268.       else {
  269.  
  270.     current = find_variable( command );
  271.       }
  272.     
  273.       if (current == NULL) {
  274.     printf("\nNo Variable ...\n");
  275.       }
  276.       else {
  277.     printf("\nVariable Name : %s\n",current->name);
  278.     printf("    mp_object : %lx\n\n", current->value);
  279.     callRequest(mp_plural,20,current->context,MP_PRINT,1,1,
  280.                          current->value);
  281.     transferred = blockIn(pe_scratch,fe_scratch,0,0,32,32,64);
  282.     fprintf(stdout,"#P( ");
  283.     for(i=0;i<1024;i++) {
  284.       if (fe_scratch[i][0] != NULL) 
  285.         fprintf(stdout,"%s ",&fe_scratch[i][0]);
  286.     }
  287.     fprintf(stdout,")\n");
  288.  
  289.       }
  290.     }
  291. DBG_EXIT(fprintf(dbg,"void"));
  292. }
  293.  
  294. Variable *find_variable( variable_name )
  295.  
  296. {
  297.   Variable *current = root;
  298.  
  299. DBG_CALL("find_varaiable");
  300. DBG_ARGS(fprintf(dbg,"variable_name=\"%s\"",variable_name));
  301.  
  302.   while (current != NULL) 
  303.     if (strcmp(current->name, variable_name)==0) {
  304.  
  305. DBG_EXIT(fprintf(dbg,"%lx",current));
  306.       return current;
  307.     }
  308.  
  309.     else current=current->next;
  310.  
  311. DBG_EXIT(fprintf(dbg,"NULL"));
  312.   return NULL;
  313. }
  314.  
  315. Variable *add_variable( variable_name )
  316.  
  317. {
  318.   Variable *variable;
  319.  
  320. DBG_CALL("add_variable");
  321. DBG_ARGS(fprintf(dbg,"variable_name=\"%s\"",variable_name));
  322.  
  323.   variable = find_variable( variable_name );
  324.  
  325.   if (variable != NULL) {
  326.  
  327. DBG_EXIT(fprintf(dbg,"%lx",variable));
  328.     return variable;
  329.   }
  330.  
  331.   variable = (Variable *) malloc( sizeof( Variable ) );
  332.   strcpy(variable->name, variable_name);
  333.   variable->next = root;
  334.   variable->value = NULL;
  335.   variable->context  = NULL;
  336.   root = variable;
  337.  
  338. DBG_EXIT(fprintf(dbg,"%lx",variable));
  339.   return variable;
  340. }
  341.       
  342.